Passed
Push — feature/93-optimize-scrutinize... ( 79e713...63e8e4 )
by Kevin Van
03:01
created

IndexPage   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 280
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 18
eloc 231
dl 0
loc 280
rs 10
c 0
b 0
f 0

14 Functions

Rating   Name   Duplication   Size   Complexity  
A renderATeamCalendarArticle 0 7 1
A renderPlayerOfTheWeek 0 13 1
A renderMatchSlider 0 4 1
A renderBTeamCalendarArticle 0 7 1
A renderYouthCalendarArticle 0 7 1
A renderMakroArticle 0 28 1
A renderPosts 0 41 3
A renderExtraContentFooter 0 15 1
B renderSocialMediaArticle 0 40 1
A renderWebsiteFeedbackArticle 0 21 1
A combineAndSortPosts 0 7 3
A renderLayoutMain 0 10 1
A renderLayoutSidebar 0 25 1
A render 0 27 1
1
import React, { Component, Fragment } from "react"
2
import { graphql } from "gatsby"
3
4
import Layout from "../layouts/index"
5
6
import SEO from "../components/seo"
7
import MetaMatches from "../components/meta-matches"
8
import MatchesOverview from "../components/matches-overview"
9
import MatchesSlider from "../components/matches-slider"
10
import {
11
  NewsItemFeatured,
12
  NewsItemCardRatio,
13
  KcvvTvCard,
14
} from "../components/news-item"
15
import { CardImage } from "../components/cards"
16
import UpcomingEvent from "../components/upcoming-event"
17
import PlayerFeatured from "../components/player--featured"
18
19
import MyMakro from "../images/mymakrokcvv.jpg"
20
21
class IndexPage extends Component {
22
  renderMatchSlider = () => (
23
    <section className={"grid-container full"}>
24
      <MatchesSlider season="1920" regnumber="00055" />
25
    </section>
26
  )
27
  renderSocialMediaArticle = () => (
28
    <article className={"medium-6 large-12 cell social"}>
29
      <div className={"social-sidebar__wrapper"}>
30
        <a
31
          href="https://facebook.com/KCVVElewijt"
32
          className="btn-social-counter btn-social-counter--fb"
33
          target="_blank"
34
          rel="noopener noreferrer"
35
        >
36
          <div className="btn-social-counter__icon">
37
            <i className="fa fa-facebook"></i>
38
          </div>
39
          <h5 className="btn-social-counter__title">
40
            Volg onze Facebook pagina
41
          </h5>
42
        </a>
43
        <a
44
          href="https://twitter.com/kcvve"
45
          className="btn-social-counter btn-social-counter--twitter"
46
          target="_blank"
47
          rel="noopener noreferrer"
48
        >
49
          <div className="btn-social-counter__icon">
50
            <i className="fa fa-twitter"></i>
51
          </div>
52
          <h5 className="btn-social-counter__title">Volg ons op Twitter</h5>
53
        </a>
54
        <a
55
          href="http://www.instagram.com/kcvve"
56
          className="btn-social-counter btn-social-counter--instagram"
57
          target="_blank"
58
          rel="noopener noreferrer"
59
        >
60
          <div className="btn-social-counter__icon">
61
            <i className="fa fa-instagram"></i>
62
          </div>
63
          <h5 className="btn-social-counter__title">Volg ons op Instagram</h5>
64
        </a>
65
      </div>
66
    </article>
67
  )
68
  renderMakroArticle = () => (
69
    <article className={"medium-6 large-12 cell card"}>
70
      <header className={"card__header"}>
71
        <h4>MyMakro</h4>
72
      </header>
73
      <div className={"card__content"}>
74
        <p>
75
          Link nu jouw Makro voordeelkaart aan onze vereniging. Bij elke aankoop
76
          bij Makro en partners steun je KCVV Elewijt!
77
        </p>
78
        <p>
79
          <img src={MyMakro} alt="QR Code MyMakro" style={{ width: "100%" }} />
80
        </p>
81
        <p>
82
          Scan bovenstaande QR-code met je camera op GSM, of surf naar{" "}
83
          <a
84
            href="https://my.makro.be/nl/link-vereniging/02277464"
85
            target="_blank"
86
            rel="noopener noreferrer"
87
            title="MyMakro link voor KCVV Elewijt"
88
          >
89
            https://my.makro.be/nl/link-vereniging/02277464
90
          </a>
91
          .
92
        </p>
93
        <p>Onze vereniging dankt jullie van harte!</p>
94
      </div>
95
    </article>
96
  )
97
  renderYouthCalendarArticle = () => (
98
    <article className={"medium-6 large-12 cell card"}>
99
      <header className="card__header">
100
        <h4>Jeugdploegen</h4>
101
      </header>
102
      <MatchesOverview season="1920" regnumber="00055" exclude="['2A', '4D']" />
103
    </article>
104
  )
105
106
  renderBTeamCalendarArticle = () => (
107
    <article className={"medium-6 large-12 cell card"}>
108
      <header className={"card__header"}>
109
        <h4>The B-Team</h4>
110
      </header>
111
      <MetaMatches season="1920" region="bra" division="4D" regnumber="00055" />
112
    </article>
113
  )
114
  renderATeamCalendarArticle = () => (
115
    <article className={"medium-6 large-12 cell card"}>
116
      <header className={"card__header"}>
117
        <h4>The A-Team</h4>
118
      </header>
119
      <MetaMatches season="1920" region="bra" division="2A" regnumber="00055" />
120
    </article>
121
  )
122
123
  renderWebsiteFeedbackArticle = () => (
124
    <article className={"medium-6 large-12 cell card"}>
125
      <header className={"card__header"}>
126
        <h4>
127
          <i className={"fa fa-commenting-o"} aria-hidden="true"></i> Website
128
          feedback
129
        </h4>
130
      </header>
131
      <div className={"card__content"}>
132
        <p>
133
          Na lang zwoegen is onze nieuwe website eíndelijk online geraakt! We
134
          zijn heel benieuwd naar jullie mening of feedback. Als jullie vinden
135
          dat er iets ontbreekt, of als je bepaalde fouten tegenkomt, zouden we
136
          het ten zeerste appreciëren als je ons even iets laat weten op{" "}
137
          <a href="mailto:[email protected]" className={"rich-link"}>
138
            [email protected]
139
          </a>
140
          !
141
        </p>
142
      </div>
143
    </article>
144
  )
145
  renderExtraContentFooter = () => (
146
    <>
147
      {/* <section className="grid-container site-content">
148
          <div className="grid-x grid-margin-x">
149
            <section className={'cell large-12 featured-article'}>
150
              <CardImage
151
                title="Voorbereidings- en bekerwedstrijden"
152
                localFile={data.preseason}
153
                link="/games"
154
                metadata={false}
155
              />
156
            </section>
157
          </div>
158
        </section> */}
159
    </>
160
  )
161
162
  renderPlayerOfTheWeek = featuredPlayer =>
163
    featuredPlayer.edges.map(
164
      ({ node: potw }) =>
165
        potw.relationships.field_player && (
166
          <article
167
            className={"medium-6 large-12 cell card"}
168
            key={potw.relationships.field_player.field_firstname}
169
          >
170
            <header className={"card__header"}>
171
              <h4>Speler van de week</h4>
172
            </header>
173
            <PlayerFeatured player={potw.relationships.field_player} />
174
          </article>
175
        )
176
    )
177
178
  renderPosts = posts => {
179
    let articleCount = 0
180
    let kcvvTvCount = 0
181
182
    return posts.map(({ node }, i) => {
183
      switch (node.internal.type) {
184
        case "node__article":
185
          node.field_featured && (articleCount = articleCount + 2)
186
          !node.field_featured && articleCount++
187
          return (
188
            <Fragment key={i}>
189
              {node.field_featured && <NewsItemFeatured node={node} />}
190
              {!node.field_featured && (
191
                <NewsItemCardRatio node={node} teaser={true} />
192
              )}
193
            </Fragment>
194
          )
195
        case "node__kcvv_tv":
196
          if (kcvvTvCount === 0) {
197
            articleCount = articleCount + 2
198
            kcvvTvCount++
199
            return (
200
              <CardImage
201
                title={node.title}
202
                localFile={
203
                  node.relationships.field_media_article_image.relationships
204
                    .field_media_image.localFile
205
                }
206
                link={node.field_website.uri}
207
                metadata={false}
208
                key={i}
209
              />
210
            )
211
          } else {
212
            articleCount = articleCount + 2
213
            kcvvTvCount++
214
            return <KcvvTvCard node={node} teaser={true} key={i} />
215
          }
216
217
        default:
218
          return ""
219
      }
220
    })
221
  }
222
223
  combineAndSortPosts = (featuredPosts, kcvvTv) => {
224
    return [...featuredPosts.edges, ...kcvvTv.edges].sort((a, b) =>
225
      a.node.timestamp < b.node.timestamp
226
        ? 1
227
        : b.node.timestamp < a.node.timestamp
228
        ? -1
229
        : 0
230
    )
231
  }
232
233
  renderLayoutSidebar = () => {
234
    const { featuredPlayer } = this.props.data
235
    return (
236
      <>
237
        {/* A TEAM OVERVIEW - SUMMARY OF MATCHES AND RANKING*/}
238
        {this.renderATeamCalendarArticle()}
239
240
        {/* B TEAM OVERVIEW - SUMMARY OF MATCHES AND RANKING */}
241
        {this.renderBTeamCalendarArticle()}
242
243
        {/* YOUTH TEAMS OVERVIEW - SUMMARY OF UPCOMING MATCHES */}
244
        {this.renderYouthCalendarArticle()}
245
246
        {/* PLAYER OF THE WEEK ARTICLE IF ANY */}
247
        {featuredPlayer && this.renderPlayerOfTheWeek(featuredPlayer)}
248
249
        {/* INFO ARTICLE WITH SOCIAL MEDIA LINKS */}
250
        {this.renderSocialMediaArticle()}
251
252
        {/* INFO ARTICLE WITH REQUEST FOR WEBSITE FEEDBACK */}
253
        {this.renderWebsiteFeedbackArticle()}
254
255
        {/* INFO ARTICLE WITH "MYMAKRO" CONTENT */}
256
        {this.renderMakroArticle()}
257
      </>
258
    )
259
  }
260
261
  renderLayoutMain = () => {
262
    const { featuredPosts, kcvvTv } = this.props.data
263
    const posts = this.combineAndSortPosts(featuredPosts, kcvvTv)
264
265
    return (
266
      <>
267
        <UpcomingEvent />
268
269
        {posts && this.renderPosts(posts)}
270
      </>
271
    )
272
  }
273
274
  render() {
275
    return (
276
      <Layout>
277
        <SEO lang="nl-BE" title="Er is maar één plezante compagnie" />
278
279
        <section className="grid-container site-content">
280
          <div className="grid-x grid-margin-x">
281
            <section className="cell large-8 news_overview__wrapper">
282
              {/* MAIN CONTENT AREA */}
283
              {this.renderLayoutMain()}
284
            </section>
285
            <aside className="cell large-4">
286
              <section className="grid-x featured__matches grid-margin-x">
287
                {/* SIDEBAR CONTENT */}
288
                {this.renderLayoutSidebar()}
289
              </section>
290
            </aside>
291
          </div>
292
        </section>
293
294
        {/* FULL-WIDTH SLICK SLIDER WITH UPCOMING MATCHES */}
295
        {this.renderMatchSlider()}
296
297
        {/* LIMITED-WIDTH CONTAINER WITH EXTRA (STICKY) CONTENT, IF ANY */}
298
        {this.renderExtraContentFooter()}
299
      </Layout>
300
    )
301
  }
302
}
303
304
export const pageQuery = graphql`
305
  query {
306
    featuredPosts: allNodeArticle(
307
      filter: { status: { eq: true }, promote: { eq: true } }
308
      sort: { fields: changed, order: DESC }
309
      limit: 10
310
    ) {
311
      edges {
312
        node {
313
          id
314
          path {
315
            alias
316
          }
317
          created(formatString: "D/M/YYYY")
318
          changed(formatString: "D/M/YYYY")
319
          timestamp: changed(formatString: "x")
320
          title
321
          promote
322
          status
323
          field_featured
324
          body {
325
            value
326
            format
327
            processed
328
            summary
329
          }
330
          relationships {
331
            field_media_article_image {
332
              ...ArticleImage
333
            }
334
            field_tags {
335
              name
336
              path {
337
                alias
338
              }
339
            }
340
          }
341
          internal {
342
            type
343
          }
344
        }
345
      }
346
    }
347
    preseason: file(name: { eq: "preseason" }) {
348
      ...KCVVFluid960
349
    }
350
    kcvvTv: allNodeKcvvTv(
351
      filter: { status: { eq: true }, promote: { eq: true } }
352
      sort: { fields: created, order: DESC }
353
      limit: 5
354
    ) {
355
      edges {
356
        node {
357
          id
358
          created(formatString: "D/M/YYYY")
359
          title
360
          timestamp: created(formatString: "x")
361
          relationships {
362
            field_media_article_image {
363
              ...ArticleImage
364
            }
365
          }
366
          field_website {
367
            uri
368
          }
369
          internal {
370
            type
371
          }
372
        }
373
      }
374
    }
375
    featuredPlayer: allNodePotw(
376
      sort: { fields: created, order: DESC }
377
      filter: { status: { eq: true } }
378
      limit: 1
379
    ) {
380
      edges {
381
        node {
382
          relationships {
383
            field_player {
384
              field_firstname
385
              field_lastname
386
              field_shirtnumber
387
              field_stats_games
388
              field_position
389
              field_stats_cleansheets
390
              field_stats_goals
391
              field_stats_cards_yellow
392
              field_stats_cards_red
393
              relationships {
394
                field_image {
395
                  localFile {
396
                    ...KCVVFixedPlayerTeaser
397
                  }
398
                }
399
              }
400
              path {
401
                alias
402
              }
403
            }
404
          }
405
        }
406
      }
407
    }
408
  }
409
`
410
411
export default IndexPage
412